package com.misyi.list;

/**
 * list 的抽象类
 *
 * @author licong
 * @date 2021-09-28 下午11:36
 */
abstract class AbstractList<E> implements List<E> {

    protected int size;

    protected static final int DEFAULT_CAPACITY = 10;

    public static final int ELEMENT_NOT_FIND = -1;

    /**
     * 返回列表的元素数量
     *
     * @return 元素值
     */
    @Override
    public int size() {
        return size;
    }

    /**
     * 判断列表是否为空
     *
     * @return 判断结果
     */
    @Override
    public boolean isEmpty() {
        return size == 0;
    }


    /**
     * 判断元素是否存在列表中
     *
     * @param element 判断的元素
     * @return 判断结果
     */
    @Override
    public boolean contains(E element) {
        return indexOf(element) != ELEMENT_NOT_FIND;
    }

    /**
     * 索引范围检查
     *
     * @param index 索引位置
     */
    protected void rangeCheck(int index) {
        if (index < 0 || index >= size) {
            throw new IndexOutOfBoundsException(String.format("操作元素索引错误: Size=%s, Index=%s", size, index));
        }
    }

    /**
     * 添加元素时索引范围检查
     *
     * @param index 索引位置
     */
    protected void rangeCheckForAdd(int index) {
        if (index < 0 || index > size) {
            throw new IndexOutOfBoundsException(String.format("添加元素索引错误: Size=%s, Index=%s", size, index));
        }
    }

    abstract protected Object node(int index);

    /**
     * 打印数组元素
     */
    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder(256);
        sb.append("列表长度=");
        sb.append(size);
        sb.append(", 元素=[");
        for (int i = 0; i < size; i++) {
            if (i != 0) {
                sb.append(", ");
            }
            sb.append(node(i));
        }
        sb.append("]");
        return sb.toString();
    }
} 
